home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / oh_towns / townsfos / twfos.bas < prev    next >
BASIC Source File  |  1991-10-18  |  16KB  |  443 lines

  1. 1000 '****************************************************************
  2. 1001 '
  3. 1002 ' TownsFOS : The F-BASIC386 Operation System
  4. 1003 '
  5. 1004 '                                                  By TaroPYON
  6. 1005 '
  7. 1006 ' Filename "TWFOS.BAS" : Version 1.02
  8. 1007 '
  9. 1008 ' Last Update 1989. 5.21
  10. 1009 '
  11. 1010 '
  12. 1011 ' 1000 初期設定
  13. 1012 ' 2000 SHELL & 内蔵コマンド
  14. 1013 ' 3000 システムサブルーチン    : 文字列処理
  15. 1014 ' 4000 システムサブルーチン2  : 入出力処理
  16. 1015 ' 5000 システムサブルーチン3  : 環境変数
  17. 1016 ' 6000 リザーブ領域1
  18. 1017 ' 7000 リザーブ領域2
  19. 1018 ' 8000 割り込み処理 & スクリーン
  20. 1019 ' 9000 エラー処理
  21. 1099 '****************************************************************
  22. 1100 '
  23. 1101 ' システム変数の設定
  24. 1102 '
  25. 1110 S_TCOL%=7:S_BCOL%=0:GOSUB *S_SCR_INIT : GOSUB *S_OPMSG
  26. 1120 *S_RUN
  27. 1130 S_DPATH$="B:\S_DATA.DAT"
  28. 1140 S_ARMAX%=32 : DIM ARGV$(S_ARMAX%) : ARGC%=0
  29. 1150 S_Q$=CHR$(&H22)
  30. 1160 DIM S_EMSG$(127) : GOSUB *S_SET_EMSG
  31. 1170 S_GRA%=0 : S_EXE%=0
  32. 1180 S_BREAK_PFKEY%=1 : S_PAUSE_PFKEY%=2
  33. 1190 S_VMAX%=80 : DIM S_VAR$(S_VMAX%,1) : S_VUSE%=0
  34. 1200 S_STDOUT%=0 : S_STDIN%=0 : S_STDERR%=0
  35. 1400 '
  36. 1401 ' 環境変数の初期設定
  37. 1402 '
  38. 1410 ON ERROR GOTO *S_VERROR
  39. 1420 OPEN "I",#1,S_DPATH$
  40. 1430 INPUT #1,A$ : S_VUSE%=VAL(A$)
  41. 1440 FOR S_I%=0 TO S_VUSE%-1
  42. 1450   LINE INPUT #1,S_VAR$(S_I%,0) : LINE INPUT #1,S_VAR$(S_I%,1)
  43. 1460 NEXT : CLOSE
  44. 1470 GOSUB *S_VARSORT
  45. 1490 GOTO *S_SHELL
  46. 1500 '
  47. 1501 ' 環境変数保存ファイルの読み取りエラー
  48. 1502 '
  49. 1503 *S_VERROR : CLOSE
  50. 1510 S_ERR%=ERR
  51. 1520 RESTORE *S_VAR_DATA : S_A$=""
  52. 1530 *S_VERR_1
  53. 1540   READ S_A$,S_B$ : IF S_A$="*END*" THEN *S_VERR_2
  54. 1550   S_VAR$(S_VUSE%,0)=S_A$ : S_VAR$(S_VUSE%,1)=S_B$ : S_VUSE%=S_VUSE%+1
  55. 1560 GOTO *S_VERR_1
  56. 1570 *S_VERR_2 : GOSUB *S_VARSORT
  57. 1580 S_A$="* 環境変数は初期化されました。\n":GOSUB *S_PUTS_E
  58. 1590 RESUME *S_VERR_WRITE
  59. 1600 '
  60. 1601 ' 環境変数の保存
  61. 1602 '
  62. 1610 *S_VERR_WRITE
  63. 1620 GOSUB *S_SAVE_VAR
  64. 1630 IF S_ERR%<>0 THEN S_A$="@ 環境変数保存ファイルがオープンできません。\n":                       GOSUB *S_PUTS_E
  65. 1690 GOTO *S_SHELL
  66. 1800 '
  67. 1801 '環境変数の初期設定値
  68. 1802 '
  69. 1803 *S_VAR_DATA
  70. 1810 DATA "$BREAK","1"
  71. 1820 DATA "$PAUSE","2"
  72. 1830 DATA "$CHD","B:"
  73. 1840 DATA "$CHX","B:"
  74. 1850 DATA "$TCOL","7"
  75. 1860 DATA "$BCOL","0"
  76. 1870 DATA "$VERSION","1.02"
  77. 1880 DATA "PROMPT","TownsFOS:"
  78. 1890 DATA "*END*",""
  79. 2000 '
  80. 2001 ' SHELL
  81. 2002 '
  82. 2003 *S_SHELL
  83. 2010 ON ERROR GOTO 0
  84. 2020 GOSUB *S_PFKEY_SET
  85. 2030 S_I$="$TCOL":GOSUB *S_GETVAR:S_TCOL%=VAL(S_A$):                             IF S_TCOL%=0 THEN S_TCOL%=7
  86. 2040 S_I$="$BCOL":GOSUB *S_GETVAR:S_BCOL%=VAL(S_A$):                             IF S_TCOL%=S_BCOL% THEN S_BCOL%=0
  87. 2050 COLOR S_TCOL%,S_BCOL%:S_I$="PROMPT" : GOSUB *S_GETVAR : PRINT S_A$;
  88. 2060 GOSUB *S_GETS
  89. 2070 IF S_I$="" THEN GOTO *S_SHELL
  90. 2080 GOSUB *S_SETARG
  91. 2090 S_I$=ARGV$(0) : IF S_I$="" THEN *S_SHELL ELSE GOSUB *S_TOUPPER
  92. 2100 '
  93. 2101 ' コマンドの解析
  94. 2102 '
  95. 2110 IF S_A$="?" THEN GOSUB *S_OPMSG : PRINT "Command [CLS: [CHD: [CHX: [DIR: [EXIT: [SET: [UNSET:":GOTO *S_SHELL
  96. 2120 IF S_A$="CHD" THEN S_I$="$CHD": GOSUB *S_CHD : GOTO *S_SHELL
  97. 2130 IF S_A$="CHX" THEN S_I$="$CHX": GOSUB *S_CHD : GOTO *S_SHELL
  98. 2140 IF S_A$="CLS" THEN GOSUB *S_CLS : GOTO *S_SHELL
  99. 2150 IF S_A$="DIR" OR S_I$="FILES" THEN GOSUB *S_DIR : GOTO *S_SHELL
  100. 2160 IF S_A$="SET" THEN GOSUB *S_SET : GOTO *S_SHELL
  101. 2170 IF S_A$="UNSET" THEN GOSUB *S_UNSET : GOTO *S_SHELL
  102. 2180 IF S_A$="EXIT" THEN PRINT "Good Bye..." : DELETE 10000- : END
  103. 2300 '
  104. 2301 ' トランジェ・コマンド
  105. 2302 '
  106. 2310 S_I$="$CHX":GOSUB *S_GETVAR
  107. 2320 IF S_A%<0 THEN S_DN$="" ELSE S_DN$=S_A$
  108. 2330 S_FN$=ARGV$(0)+".BAS" : GOSUB *S_MAKFN
  109. 2340 ON ERROR GOTO *S_ERROR
  110. 2350 OPEN "I",#5,S_FLNAME$ : CLOSE #5 : 'Bug 対策用
  111. 2360 CHAIN MERGE S_FLNAME$,2403,ALL,DELETE 10000-
  112. 2400 '
  113. 2401 ' トランジェ・コマンド実行部分
  114. 2402 '
  115. 2403 *S_TRANGE
  116. 2410 GOSUB *S_PFKEY_SET
  117. 2420 S_ERR%=0 : S_EXE%=-1 : S_GRA%=0
  118. 2430 ON ERROR GOTO *S_ERROR
  119. 2440 GOSUB 10000
  120. 2450 *S_T_RETURN
  121. 2460 IF S_GRA% THEN GOSUB *S_SCR_INIT:S_GRA%=0
  122. 2470 IF S_ERR% THEN GOSUB *S_EMSG_PUT
  123. 2490 RUN *S_RUN
  124. 2500 '
  125. 2501 ' 内蔵コマンド処理
  126. 2502 '
  127. 2504 *S_CLS
  128. 2510 COLOR S_TCOL%,S_BCOL%,S_TCOL% : CLS
  129. 2590 RETURN
  130. 2600 '
  131. 2601 ' CHD & CHX
  132. 2602 '
  133. 2604 *S_CHD
  134. 2610 IF ARGC%>1 THEN *S_CHD2
  135. 2620 GOSUB *S_GETVAR:IF S_A%<0 THEN                                              S_A$="@ ディレクトリが設定されていません。\n":GOSUB *S_PUTS_E:RETURN
  136. 2630 PRINT "=",S_A$
  137. 2640 RETURN
  138. 2650 *S_CHD2
  139. 2660 S_I2$=ARGV$(1):IF INSTR(S_I2$,":")<>2 OR LEN(S_I2$)<2 THEN                     S_A$="ディレクトリ設定エラー\n":GOSUB *S_PUTS_E : RETURN
  140. 2670 S_I1$=S_I$
  141. 2680 GOSUB *S_SETVAR
  142. 2690 RETURN
  143. 2700 '
  144. 2701 ' Directory
  145. 2702 '
  146. 2704 *S_DIR : S_PN$="*.*"
  147. 2710 IF ARGC%=1 THEN S_I$="$CHD":GOSUB *S_GETVAR:S_DN$=S_A$:GOTO *S_DIR2
  148. 2720   IF ARGV$(1)="-X" OR ARGV$(1)="-x" THEN S_I="$CHX":GOSUB *S_GETVAR:                                                 S_DN$=S_A$:GOTO *S_DIR2
  149. 2730   S_PN$=ARGV$(1)
  150. 2740 *S_DIR2
  151. 2750 GOSUB *S_MAKPATH
  152. 2760 ON ERROR GOTO *S_ERROR
  153. 2770 FILES S_PNAME$
  154. 2790 RETURN
  155. 2800 '
  156. 3000 '
  157. 3001 ' 大文字を小文字に変換する。in:S_I$  out:S_A$
  158. 3002 '
  159. 3004 *S_TOUPPER
  160. 3010 S_A$="" : S_L%=KLEN(S_I$) : IF S_L%=0 THEN RETURN
  161. 3020 FOR S_I%=1 TO S_L%
  162. 3030   S_C%=ASC(KMID$(S_I$,S_I%,1))
  163. 3040   IF S_C%>=ASC("a") AND S_C%<=ASC("z") THEN S_C%=S_C%-&H20
  164. 3050   S_A$=S_A$+CHR$(S_C%)
  165. 3060 NEXT
  166. 3090 RETURN
  167. 3200 '
  168. 3201 ' 文字列が数値かどうか調べる in:S_I$ out:S_A%
  169. 3202 '
  170. 3204 *S_CHKNUM
  171. 3210 S_A%=-1 : S_L%=KLEN(S_I$) : IF S_L%=0 THEN RETURN ELSE S_I%=1
  172. 3220 *S_CHKNUM1 : S_C$=KMID$(S_I$,S_I%,1) : S_I%=S_I%+1
  173. 3230   IF S_I%>S_L% THEN IF INSTR("0123456789+-.",S_C$)=0 THEN RETURN ELSE                                                                 A=0:RETURN
  174. 3240   IF S_C$=" " THEN *S_CHKNUM1
  175. 3250   IF INSTR("0123456789+-.",S_C$)=0 THEN RETURN
  176. 3260 *S_CHKNUM2 : S_C$=KMID$(S_I$,S_I%,1) : S_I%=S_I%+1
  177. 3270   IF INSTR("0123456789.",S_C$)=0 THEN RETURN
  178. 3280 IF S_I%>S_L% THEN S_A%=0:RETURN ELSE GOTO *S_CHKNUM2
  179. 3300 '
  180. 3301 ' 文字列を単語に分解する。 in:S_I$  out:ARGC%,ARGV$()
  181. 3302 '
  182. 3304 *S_SETARG
  183. 3310 ARGC%=0:FOR S_I%=0 TO S_ARMAX% : ARGV$(S_I%)="" : NEXT
  184. 3320 S_L%=KLEN(S_I$) : IF S_L%=0 THEN RETURN
  185. 3330 S_I%=1 : S_A$="" : S_CM%=0
  186. 3340 *S_SETARG1
  187. 3350   S_A$=KMID$(S_I$,S_I%,1) : S_I%=S_I%+1
  188. 3360   IF S_A$=" " OR S_A$=" " THEN *S_SETARG1
  189. 3370   IF S_A$="," THEN ARGC%=ARGC%+1:S_CM%=-1:GOTO *S_SETARG1
  190. 3380   IF S_A$="" THEN IF S_CM% THEN ARGC%=ARGC%+1:RETURN ELSE RETURN
  191. 3390   *S_SETARG2
  192. 3400     IF S_A$=S_Q$ THEN *S_SETARG4
  193. 3410     ARGV$(ARGC%)=ARGV$(ARGC%)+S_A$
  194. 3420   *S_SETARG3
  195. 3430     S_B$=S_A$:S_A$=KMID$(S_I$,S_I%,1) : IF S_I%>S_L% THEN *S_SETARG5                                                             ELSE S_I%=S_I%+1
  196. 3440     IF S_A$=" " OR S_A$=" " OR S_A$="," THEN *S_SETARG5
  197. 3450   GOTO *S_SETARG2
  198. 3460   *S_SETARG4
  199. 3470     S_A$=KMID$(S_I$,S_I%,1):S_I%=S_I%+1
  200. 3480     IF S_A$=S_Q$ THEN *S_SETARG3
  201. 3490     ARGV$(ARGC%)=ARGV$(ARGC%)+S_A$ : IF S_I%>S_L% THEN *S_SETARG5
  202. 3500   GOTO *S_SETARG4
  203. 3510   *S_SETARG5
  204. 3520   S_B$=S_A$:S_J%=S_I%:WHILE S_A$=" " OR S_A$=" ":S_A$=KMID$(S_I$,S_I%,1):S_I%=S_I%+1:WEND:IF S_A$<>"," THEN S_I%=S_I%-1
  205. 3530   IF S_I%<S_J% THEN S_I%=S_J%
  206. 3540   ARGC%=ARGC%+1 : IF S_A$<>"," THEN S_CM%=0 ELSE S_CM%=-1
  207. 3550   IF S_I%>S_L% THEN IF S_CM% THEN ARGC%=ARGC%+1:RETURN ELSE RETURN
  208. 3560 GOTO *S_SETARG1
  209. 3600 '
  210. 3601 ' ファイルネームの設定 in:S_DN$,S_FN$ out:S_FLNAME$
  211. 3602 '
  212. 3604 *S_MAKFN
  213. 3610 IF S_DN$="" THEN S_FLNAMR$=S_FN$:RETURN
  214. 3620 IF INSTR(S_FN$,":") THEN S_FLNAME$=S_FN$:RETURN
  215. 3630 IF LEFT$(S_FN$,1)="\" THEN S_FLNAME$=LEFT$(S_DN$,2)+S_FN$:RETURN
  216. 3640 IF RIGHT$(S_DN$,1)="\" THEN S_FLNAME$=S_DN$+S_FN$:RETURN
  217. 3650 IF RIGHT$(S_DN$,1)=":" THEN S_FLNAME$=S_DN$+S_FN$:RETURN
  218. 3660 S_FLNAME$=S_DN$+"\"+S_FN$
  219. 3690 RETURN
  220. 3700 '
  221. 3701 ' ディレトクリの設定 in:S_DN$,S_PN$ out:S_PNAME$
  222. 3702 '
  223. 3704 *S_MAKPATH
  224. 3710 IF RIGHT$(S_PN$,1)="\" THEN S_PN$=S_PN$+"*.*"
  225. 3720 IF INSTR(S_PN$,":") THEN S_PNAME$=S_PN$:RETURN
  226. 3730 IF LEFT$(S_PN$,1)="\" THEN S_PNAME$=LEFT$(S_CHD$,2)+S_PN$:RETURN
  227. 3740 IF RIGHT$(S_DN$,1)="\" THEN S_PNAME$=S_DN$+S_PN$:RETURN
  228. 3750 IF RIGHT$(S_DN$,1)=":" THEN S_PNAME$=S_DN$+S_PN$:RETURN
  229. 3760 S_PNAME$=S_DN$+"\"+S_PN$
  230. 3790 RETURN
  231. 4000 '
  232. 4001 ' 文字列の入力  : out:S_I$
  233. 4002 '
  234. 4004 *S_GETS
  235. 4010 S_I$="KANJI_IN" : GOSUB *S_GETVAR :                                         IF S_A%>=0 THEN LINE INPUT S_I$:RETURN
  236. 4020 S_X%=POS(0):S_Y%=CSRLIN:S_I$="":S_P%=0
  237. 4030 *S_GET_LOOP:S_K$="":PRINT "_";:GOSUB *S_GET_BACK:                           WHILE S_K$="":S_K$=INKEY$:WEND:                                             S_K%=ASC(S_K$):PRINT " ";:GOSUB *S_GET_BACK
  238. 4040 IF S_K%=13 THEN PRINT : S_A%=KLEN(S_I$):RETURN
  239. 4050 IF S_K%<>8 THEN *S_GET_2 : 'Back Spsce 
  240. 4060   IF S_P%=0 THEN *S_GET_LOOP
  241. 4070   IF S_P%=1 THEN S_I$="" ELSE S_I$=LEFT$(S_I$,S_P%-1)
  242. 4080   GOSUB *S_GET_BS:GOTO *S_GET_LOOP
  243. 4090 *S_GET_2
  244. 4100 IF S_K%=3 THEN S_I$="":S_A%=-3:WHILE S_P%>0:GOSUB *S_GET_BS:WEND:                          PRINT "@ CANCEL" : RETURN
  245. 4110 IF S_K%<&H20 THEN GOTO *S_GET_LOOP
  246. 4120 PRINT S_K$; : S_I$=S_I$+S_K$ : S_P%=S_P%+1
  247. 4190 GOTO *S_GET_LOOP
  248. 4300 '
  249. 4304 *S_GET_BACK 
  250. 4310 S_X%=POS(0):S_Y%=CSRLIN
  251. 4320 S_X%=S_X%-1:IF S_X%>=0 THEN LOCATE S_X%,S_Y%:RETURN
  252. 4330 IF S_Y%=0 THEN S_X%=0 ELSE S_X%=79
  253. 4340 S_Y%=S_Y%-1:IF S_Y%<0 THEN S_Y%=0
  254. 4350 LOCATE S_X%,S_Y%:RETURN
  255. 4360 '
  256. 4364 *S_GET_BS
  257. 4370 IF S_P%=0 THEN RETURN
  258. 4380 GOSUB *S_GET_BACK:PRINT " ";:GOSUB *S_GET_BACK:S_P%=S_P%-1
  259. 4390 RETURN
  260. 4500 '
  261. 4501 ' 文字列の出力 : in:S_A$
  262. 4502 '
  263. 4504 *S_PUTS : S_PUT_P%=S_STDOUT%
  264. 4510 *S_PUT_6: S_PUT_L%=KLEN(S_A$):S_PUT_S$="":IF S_PUT_L%=0 THEN RETURN
  265. 4520 *S_PUT_3: FOR S_PUT_I%=1 TO S_PUT_L%:S_PUT_K$=KMID$(S_A$,S_PUT_I%,1)
  266. 4530             IF S_PUT_K$="\" THEN *S_PUT_C
  267. 4540 *S_PUT_5:   S_PUT_S$=S_PUT_S$+S_PUT_K$
  268. 4550 *S_PUT_4: NEXT:GOTO *S_PUT_2
  269. 4560 *S_PUT_C: S_PUT_K$=KMID$(S_A$,S_PUT_I%+1,1):S_PUT_I%=S_PUT_I%+1
  270. 4570 IF S_PUT_K$="n" THEN S_PUT_K$=CHR$(&H0A)+CHR$(&H0D):GOTO *S_PUT_5
  271. 4590 IF S_PUT_K$="\" THEN GOTO *S_PUT_5
  272. 4690 GOTO *S_PUT_4
  273. 4700 '
  274. 4704 *S_PUT_2 : ON S_PUT_P% GOTO *S_PUT_21,*S_PUT_22,*S_PUT_23,*S_PUT_24
  275. 4705            PRINT    S_PUT_S$;:RETURN
  276. 4710 *S_PUT_21: PRINT #1,S_PUT_S$;:RETURN
  277. 4720 *S_PUT_22: PRINT #2,S_PUT_S$;:RETURN
  278. 4730 *S_PUT_23: PRINT #3,S_PUT_S$;:RETURN
  279. 4740 *S_PUT_24: PRINT #4,S_PUT_S$;:RETURN
  280. 4800 '
  281. 4804 *S_PUTS_E : S_PUT_P%=S_STDERR%
  282. 4810 GOTO *S_PUT_6
  283. 5000 '
  284. 5001 ' 環境変数の読み取り in:S_I$  out:S_A$,S_A%
  285. 5002 '
  286. 5004 *S_GETVAR
  287. 5010 GOSUB *S_TOUPPER : S_M$=S_A$
  288. 5020 FOR S_VAR_I%=0 TO S_VUSE%-1
  289. 5030   S_I$=S_VAR$(S_VAR_I%,0) : GOSUB *S_TOUPPER
  290. 5040   IF S_M$=S_A$ THEN S_A$=S_VAR$(S_VAR_I%,1) : S_A%=S_VAR_I% : RETURN
  291. 5050 NEXT
  292. 5060 S_A$="" : S_A%=-1
  293. 5090 RETURN
  294. 5100 '
  295. 5101 ' 環境変数の設定 in:S_I1$,S_I2$ 
  296. 5102 '
  297. 5104 *S_SETVAR
  298. 5110 S_I$=S_I1$:GOSUB *S_GETVAR:IF S_A%<0 THEN S_A%=S_VUSE%:                                                S_VAR$(S_A%,0)=S_I1$:S_VUSE%=S_VUSE%+1
  299. 5120 S_VAR$(S_A%,1)=S_I2$ : GOSUB *S_VARSORT
  300. 5130 GOSUB *S_SAVE_VAR
  301. 5190 RETURN
  302. 5200 '
  303. 5201 ' 環境変数のソーティング
  304. 5202 '
  305. 5204 *S_VARSORT : KEY (S_BREAK_PFKEY%) STOP
  306. 5210 FOR S_II%=0 TO S_VUSE%-2 : FOR S_JJ%=S_II%+1 TO S_VUSE%-1
  307. 5220   S_I$=S_VAR$(S_II%,0):GOSUB *S_TOUPPER:S_II1$=S_A$
  308. 5230   S_I$=S_VAR$(S_JJ%,0):GOSUB *S_TOUPPER:S_II2$=S_A$
  309. 5240   IF S_II1$>S_II2$ THEN SWAP S_VAR$(S_II%,0),S_VAR$(S_JJ%,0):                                       SWAP S_VAR$(S_II%,1),S_VAR$(S_JJ%,1)
  310. 5250 NEXT : NEXT
  311. 5290 RETURN
  312. 5300 '
  313. 5301 ' 環境変数の削除 in:S_I$ out:S_A%
  314. 5302 '
  315. 5304 *S_DELVAR
  316. 5310 GOSUB *S_GETVAR:IF S_A%<0 THEN RETURN
  317. 5320 KEY (S_BREAK_PFKEY%) STOP : IF S_A%=S_VUSE%-1 THEN *S_VDL2
  318. 5330 FOR S_I%=S_A% TO S_VUSE%-1
  319. 5340   S_VAR$(S_I%,0)=S_VAR$(S_I%+1,0):S_VAR$(S_I%,1)=S_VAR$(S_I%+1,1)
  320. 5350 NEXT
  321. 5360 *S_VDL2:S_VUSE%=S_VUSE%-1
  322. 5380 GOSUB *S_SAVE_VAR
  323. 5390 RETURN
  324. 5400 '
  325. 5401 ' 環境変数の保存
  326. 5402 '
  327. 5404 *S_SAVE_VAR : KEY (S_BREAK_PFKEY%) STOP : S_ERR%=0
  328. 5410 ON ERROR GOTO *S_SVERR
  329. 5420   KILL S_DPATH$ : OPEN "O",#5,S_DPATH$
  330. 5430   PRINT #5,STR$(S_VUSE%)
  331. 5440   FOR S_II%=0 TO S_VUSE%-1
  332. 5450     PRINT #5,S_VAR$(S_II%,0):PRINT #5,S_VAR$(S_II%,1)
  333. 5460   NEXT
  334. 5470 *S_SVRES
  335. 5480   CLOSE #5
  336. 5490 RETURN
  337. 5500 '
  338. 5503 *S_SVERR
  339. 5510 IF ERR=63 THEN S_ERR%=0 : RESUME NEXT : 'File Not Found
  340. 5520 S_ERR%=ERR
  341. 5530 S_A$="@ 環境変数の保存ができません。\n":GOSUB *S_PUTS_E
  342. 5540 RESUME *S_SVRES
  343. 5600 '
  344. 5601 ' 環境変数の設定 内蔵コマンド
  345. 5602 '
  346. 5604 *S_SET
  347. 5610 IF ARGC%=1 THEN *S_SET01 ELSE IF ARGC%=2 THEN *S_SET02
  348. 5620 S_I1$=ARGV$(1):S_I2$=ARGV$(2):GOSUB *S_SETVAR
  349. 5630 IF LEFT$(S_I1$,1)="$" THEN RUN *S_RUN
  350. 5640 RETURN
  351. 5650 *S_SET01 : FOR S_I%=0 TO S_VUSE%-1 : PRINT S_VAR$(S_I%,0),"= ";                                                        S_VAR$(S_I%,1) : NEXT
  352. 5660 RETURN
  353. 5670 *S_SET02 : S_I$=ARGV$(1):GOSUB *S_GETVAR : IF S_A%>=0 THEN                             PRINT S_VAR$(S_A%,0),"= ";S_VAR$(S_A%,1): RETURN
  354. 5680 S_A$="@ 指定の環境変数は設定されていません。\n":GOSUB *S_PUTS_E
  355. 5690 RETURN
  356. 5700 '
  357. 5701 ' 環境変数の削除 内蔵コマンド
  358. 5702 '
  359. 5704 *S_UNSET
  360. 5710 IF ARGC%=1 THEN *S_UNSET01 ELSE S_I$=ARGV$(1)
  361. 5720 *S_UNSET02
  362. 5730 IF LEFT$(S_I$,1)="$" THEN S_A$="@ システム変数は削除できません。\n":                                  GOSUB *S_PUTS_E:RETURN
  363. 5740 GOSUB *S_DELVAR :IF S_A%<0 THEN                                             S_A$="@ 指定の環境変数は設定されていません。\n" : GOSUB *S_PUTS_E
  364. 5750 RETURN
  365. 5760 *S_UNSET01:FOR S_I%=0 TO S_VUSE%-1:PRINT RIGHT$("  "+STR$(S_I%+1),3);        " ";S_VAR$(S_I%,0) : NEXT : PRINT " ? ";
  366. 5770 GOSUB *S_GETS : IF S_I$="" THEN RETURN ELSE S_I%=VAL(S_I$)
  367. 5780 IF S_I%<=0 OR S_I%>S_VUSE% THEN RETURN
  368. 5790 S_I$=S_VAR$(S_I%-1,0) : GOTO *S_UNSET02
  369. 8000 '
  370. 8001 ' PF-KEY の設定
  371. 8002 '
  372. 8004 *S_PFKEY_SET
  373. 8010 S_I$="$BREAK":GOSUB *S_GETVAR:IF S_A%<0 THEN RETURN
  374. 8020 S_A%=VAL(S_A$):IF S_A%=0 OR S_A%>10 THEN RETURN
  375. 8030 S_BREAK_PFKEY%=S_A%
  376. 8040 S_I$="$PAUSE":GOSUB *S_GETVAR:IF S_A%<0 THEN RETURN
  377. 8050 S_A%=VAL(S_A$):IF S_A%=0 OR S_A%>10 THEN RETURN
  378. 8060 S_PAUSE_PFKEY%=S_A%
  379. 8070 ON KEY(S_BREAK_PFKEY%) GOSUB *S_BREAK:                                      ON KEY(S_PAUSE_PFKEY%) GOSUB *S_PAUSE
  380. 8080 KEY (S_BREAK_PFKEY%) ON : KEY (S_PAUSE_PFKEY%) ON
  381. 8090 RETURN
  382. 8100 '
  383. 8101 ' BREAK KEY 処理
  384. 8102 '
  385. 8104 *S_BREAK
  386. 8110 IF S_GRA% THEN GOSUB *S_SCR_INIT
  387. 8120 PRINT : RUN *S_RUN
  388. 8200 '
  389. 8201 ' PAUSE KEY 処理
  390. 8202 '
  391. 8204 *S_PAUSE
  392. 8210 WHILE INKEY$<>"":WEND
  393. 8220 WHILE INKEY$="":WEND
  394. 8290 RETURN
  395. 8300 '
  396. 8301 ' 画面初期設定
  397. 8302 '
  398. 8304 *S_SCR_INIT
  399. 8310 COLOR S_TCOL%,S_BCOL%,7 : WIDTH 80,25
  400. 8390 RETURN
  401. 8400 '
  402. 8401 ' オープニング・メッセージ
  403. 8402 '
  404. 8404 *S_OPMSG
  405. 8410 PRINT:PRINT "***** TownsFOS Ver.1.02 : By TaroPYON *****":PRINT 
  406. 8420 PRINT SPC(4);STR$(FRE(4));" Bytes Free" : PRINT 
  407. 8490 RETURN
  408. 8997 '
  409. 8998 ' エラーメッセージの設定
  410. 8999 '
  411. 9000 *S_SET_EMSG
  412. 9051 S_EMSG$(51)="Bad File Mode"
  413. 9052 S_EMSG$(52)="File Alreay Open"
  414. 9053 S_EMSG$(53)="Device I/O Error"
  415. 9054 S_EMSG$(54)="Input Past End"
  416. 9055 S_EMSG$(55)="Bad File Descripter"
  417. 9056 S_EMSG$(56)="Direct Statement in File"
  418. 9057 S_EMSG$(57)="File Not Open"
  419. 9058 S_EMSG$(58)="Bad Data in File"
  420. 9059 S_EMSG$(59)="Device in Use"
  421. 9060 S_EMSG$(60)="Device Unavailable"
  422. 9061 S_EMSG$(61)="Buffer Overflow"
  423. 9062 S_EMSG$(62)="Protected Program"
  424. 9063 S_EMSG$(63)="File Not Found"
  425. 9064 S_EMSG$(64)="File Alreay Exist"
  426. 9065 S_EMSG$(65)="Directry Full"
  427. 9190 RETURN
  428. 9200 '
  429. 9201 ' エラーメッセージの出力
  430. 9202 '
  431. 9204 *S_EMSG_PUT
  432. 9210 S_A$="@ Line"+STR$(ERL)+" : "
  433. 9220 IF S_EMSG$(S_ERR%)="" THEN S_A$=S_A$+"ERROR #"+MID$(STR$(S_ERR%),2)+"\n":                              GOSUB *S_PUTS_E : RETURN
  434. 9230 S_A$=S_A$+S_EMSG$(S_ERR%)+"\n" : GOSUB *S_PUTS_E
  435. 9290 RETURN
  436. 9300 '
  437. 9301 ' エラートラップ処理
  438. 9302 '
  439. 9304 *S_ERROR
  440. 9310 IF S_GRA% THEN GOSUB *S_SCR_INIT : S_GRA%=0
  441. 9320 S_ERR%=ERR : GOSUB *S_EMSG_PUT
  442. 9330 RUN *S_RUN
  443.